Manipulate[

{{xmin,xmax},{ymin,ymax}}={{-3,3},{-3,3}};
{zmin,zmax}=Evaluate@Switch[f,
Function[{x1,y1},Sin[x1-y1]+Cos[x1]],{-2,2},
Function[{x1,y1},x1*Cos[y1]],{-3,3},
Function[{x1,y1},(x1^2-y1^2)/2],{-5,5},
Function[{x1,y1},4-x1^2-y1^2],{-14,4}
];
plotrange={{xmin,xmax},{ymin,ymax},{zmin,zmax}};

Column[{Item[
Grid[{
{Text@Style[Row[{Style["f",Italic],"(",Style["x",Italic],", ",Style["y",Italic],") = ",TraditionalForm[f[x,y]]}],16],SpanFromLeft},
{
Show[
If[showsurf,Plot3D[f[x,y],{x,xmin,xmax},{y,ymin,ymax},Mesh->False,PlotStyle->{Gray,Opacity[surfopac]},BoundaryStyle->None],{}],

If[fixy,ParametricPlot3D[{x,y0,f[x,y0]},{x,xmin,xmax},PlotStyle->{Thick,Darker[Green,0.5]}],{}],
If[fixx,ParametricPlot3D[{x0,y,f[x0,y]},{y,ymin,ymax},PlotStyle->{Thick,Purple}],{}],

If[showxpart,ParametricPlot3D[{1t+x0,0t+y0,(D[f[x,y],x]/.{x->x0,y->y0})t+f[x0,y0]},{t,-1,1},PlotStyle->{Green,Thick}],{}],

If[showypart,ParametricPlot3D[{0t+x0,1t+y0,(D[f[x,y],y]/.{x->x0,y->y0})t+f[x0,y0]},{t,-1,1},PlotStyle->{Red,Thick}],{}],

Graphics3D[{
{Black,PointSize[0.03],Point[{{x0,y0,f[x0,y0]}}]},
If[fixx,{Lighter[Purple,0.5],Opacity[0.3],Cuboid[{x0,ymin*1.1,zmin*1.1},{x0,ymax*1.1,zmax*1.1}]},{}],
If[fixy,{Green,Opacity[0.3],Cuboid[{xmin*1.1,y0,zmin*1.1},{xmax*1.1,y0,zmax*1.1}]},{}]
}],

Boxed->False,Axes->True,AxesEdge->Table[-1,{3},{2}],BoxRatios->Automatic,ImageSize->{500,500},
AxesLabel->Map[Style[#,14]&,{"x","y","z"}],PlotRange->plotrange
],

Item[Style[Column[{
"",
If[showvalues&&showxpart,Text@Style[Column[{
Row[{Subscript[Style["f",Italic],Style["x",Italic]],"(",Style["x",Italic],", ",Style["y",Italic],") = ",TraditionalForm[D[f[x,y],x]]}],
"",
Row[{Subscript[Style["f",Italic],Style["x",Italic]],"(",x0,", ",y0,") = ",TraditionalForm[D[f[x,y],x]/.{x->x0,y->y0}]}],
}],Darker[Green,0.5]],""],
"","",
If[showvalues&&showypart,Text@Style[Column[{
Row[{Subscript[Style["f",Italic],Style["y",Italic]],"(",Style["x",Italic],", ",Style["y",Italic],") = ",TraditionalForm[D[f[x,y],y]]}],
"",
Row[{Subscript[Style["f",Italic],Style["y",Italic]],"(",x0,", ",y0,") = ",TraditionalForm[D[f[x,y],y]/.{x->x0,y->y0}]}],
}],Red],""]
}],12],ItemSize->16,Alignment->Left]
}},Alignment->Top],
ItemSize->{Automatic,32},Alignment->Top
]}],

{{f,Function[{x1,y1},Sin[x1-y1]+Cos[x1]],"f(x, y) ="},{
Function[{x1,y1},Sin[x1-y1]+Cos[x1]]->TraditionalForm[Sin[x-y]+Cos[x]],
Function[{x1,y1},x1*Cos[y1]]->TraditionalForm[x*Cos[y]],
Function[{x1,y1},(x1^2-y1^2)/2]->TraditionalForm[(x^2-y^2)/2],
Function[{x1,y1},4-x1^2-y1^2]->TraditionalForm[4-x^2-y^2]
},
PopupMenu}
,
{{x0,0,Subscript["x",0]},-3,3},
{{y0,0,Subscript["y",0]},-3,3},
{{fixy,False,"fixed y plane"},{True,False},ControlPlacement->Left},
{{showxpart,False,"show x-partial"},{True,False},ControlPlacement->Left},
Delimiter,
{{fixx,False,"fixed x plane"},{True,False},ControlPlacement->Left},
{{showypart,False,"show y-partial"},{True,False},ControlPlacement->Left},
Delimiter,
{{showsurf,True,"show surface"},{True,False},ControlPlacement->Left},
{{showvalues,False,"show values"},{True,False},ControlPlacement->Left,Enabled->(showxpart||showypart)},
{{surfopac,0.5,"surface opacity"},0,1,ControlPlacement->Top},
TrackedSymbols->Manipulate,AutorunSequencing->{1,2,3,4,6,10}
]